#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 4  //定义RC522的SDA引脚的接线位置。
#define RST_PIN 5  //定义RC522的RST引脚的接线位置。

String refid1="";//先声明一个空的字符串全局变量。以便后面存储nuidPICC里面的数据。

MFRC522 rfid(SS_PIN, RST_PIN); //实例化类


#define gpio 16
// 初始化数组用于存储读取到的NUID 
byte nuidPICC[4];
 
void setup() { 
  Serial.begin(9600);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522 
  pinMode(gpio, OUTPUT);
  Serial.println("设置完成，已经可以开始验证！");
}
 
void loop() {
 
  // 找卡
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
 
  // 验证NUID是否可读
  if ( ! rfid.PICC_ReadCardSerial())
    return;
 
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
 
  // 检查是否MIFARE卡类型
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("不支持读取此卡类型");
    return;
  }
  
  // 将NUID保存到nuidPICC数组
  for (byte i = 0; i < 4; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
  }   
  Serial.print("十进制UID：");
  printHex(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();
  
  //对读取的卡号进行比较，注意数据类型。
  if(refid1=="119179114201"){
        //判断为真，执行需要的程序。
        Serial.println("已验证，确认为用户1");
        digitalWrite(gpio, HIGH);
        Serial.println("继电器打开");
        delay(20000);
        
    }
  else if(refid1=="16912821185"){
       Serial.println("已验证，确认为用户2");
       digitalWrite(gpio, LOW);
       Serial.println("继电器关闭");
       delay(20000);
    }
  else if(refid1=="0119568217"){
       Serial.println("已验证，确认为用户3");
       digitalWrite(gpio, LOW);
       Serial.println("继电器关闭");
       delay(20000);
    }
  else{
       //判断为假，执行需要的程序。
       Serial.println("验证失败，确认为非用户");
    }
    

  
  // 使放置在读卡区的IC卡进入休眠状态，不再重复读卡
  rfid.PICC_HaltA();
 
  // 停止读卡模块编码
  rfid.PCD_StopCrypto1();
  refid1="";

}
 
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : "");
    
 //这里对nuidPICC进行存储 
    refid1+=nuidPICC[i];
    
  }
   //这里对nuidPICC打印，看是是自己需要的数据。 
  Serial.print(refid1);
}
